package cn.leftsite.juc.atomic;

import java.util.concurrent.atomic.AtomicReference;

/**
 * @author wangjinqiang
 * @date 2019-06-06
 */
public class AtomicReferenceDemo {
    static AtomicReference<Integer> money = new AtomicReference<>(19);

    public static void main(String[] args) {
        // 模拟多个线程同时更新后台数据，为用户充值
        for (int i = 0; i < 3; i++) {
            new Thread(()->{
                while (true){
                    while (true){
                        Integer m = money.get();
                        if (m < 20) {
                            if (money.compareAndSet(m, m + 20)){
                                System.out.println("余额小于20元，充值成功, 余额:" + money.get() + "元");
                                break;
                            }
                        }else {
                            // 余额大于20元，无须充值
                            break;
                        }
                    }
                }
            }).start();
        }

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                while (true) {
                    Integer m = money.get();
                    if (m > 10) {
                        System.out.println("大于10元");
                        if (money.compareAndSet(m, m-10)){
                            System.out.println("成功消费10元，余额：" + money.get());
                            break;
                        }
                    }else {
                        System.out.println("没有足够的金额");
                        break;
                    }
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
